package com.swak.reactivex.threads;

import java.util.concurrent.TimeoutException;

/**
 * 等待的方式.
 * 
 * 应用层的线程必须进入等待状态，才能保持住.
 * 
 * 忙等(执行应用层无效代码 NOOP) -> yield(让出执行权) -> 有限时间的等待(wait) (配合notify) -> 阻塞
 * 
 * @author 618lf
 */
public interface WaitStrategy {

	/**
	 * 进入等待状态
	 */
	void waitFor(Barrier barrier) throws InterruptedException, TimeoutException;

	/**
	 * 是否有需要执行的任务
	 * 
	 * @param barrier
	 * @return
	 */
	default boolean checkBarrier(Barrier barrier) {
		return barrier.check() == 0;
	}

	/**
	 * 唤醒
	 */
	void wakeup();
}